<?php
/**
 * Fluxo de Desvinculação
 * @author bruno
 * @since 03/05/2010
 */
class FluxoDesvinculacao extends BaseFluxoDesvinculacao implements InterfaceFluxo
{
    /**
     * Solicita a desvinculação de um candidato
     * @param CandidatoVaga $candidatoVaga
     * @param $parecer
     */
    public static function solicitar(CandidatoVaga $candidatoVaga, $parecer)
    {
        self::isAuthorized('solicitar', $candidatoVaga, TRUE);
        
        global $pfcid;
    	
        switch ($pfcid) {
            case PerfilComportamental::Orgao:
                $statusid = Status::Devolucao_Solicitada_Orgao;
                break;
            case PerfilComportamental::NucleoGestor:
                $statusid = Status::Devolucao_Solicitada_NucleoGestor;
                break;
            default:
                throw new Exception('Solicitante Inválido.');
                break;
        }
        
        $candidatoVaga->inserirHistorico($statusid, $parecer);
    }
    
    /**
     * Aprova a desvinculação de um candidato
     * @param CandidatoVaga $candidatoVaga
     * @param $parecer
     */
    public static function aprovar(CandidatoVaga $candidatoVaga, $parecer)
    {
        self::isAuthorized('aprovar', $candidatoVaga, TRUE);
        
        global $pfcid;
        
        switch ($pfcid) {
            case PerfilComportamental::Gabinete:
                $statusid = Status::Devolucao_Aprovada_NucleoCentral;
                break;
            case PerfilComportamental::Orgao:
                $statusid = Status::Devolucao_Aprovada_Orgao;
                break;
            default:
                throw new Exception('Solicitante Inválido.');
                break;
        }
        
        $candidatoVaga->inserirHistorico($statusid, $parecer);
    }
    
    /**
     * Reprova a desvinculação de um terceirizado 
     * @param CandidatoVaga $candidatoVaga
     * @param $parecer
     */
    public static function reprovar(CandidatoVaga $candidatoVaga, $parecer)
    {
        self::isAuthorized('reprovar', $candidatoVaga, TRUE);
        
        global $pfcid;
        
        switch ($pfcid) {
            case PerfilComportamental::Gabinete:
                $statusid = Status::Devolucao_Recusada_NucleoCentral;
                break;
            case PerfilComportamental::Orgao:
                $statusid = Status::Devolucao_Recusada_Orgao;
                break;
            default:
                throw new Exception('Solicitante Inválido.');
                break;
        }
        
        $candidatoVaga->inserirHistorico($statusid, $parecer);
    }
    
    /**
     * Encaminha a desvinculação sem substituição de um terceirizado para a terceirizada
     * @param CandidatoVaga $candidatoVaga
     * @param $parecer
     * @param $demissaoSugestao
     */
    public static function encaminharSemSubstituicao(CandidatoVaga $candidatoVaga, $parecer, $demissaoSugestao)
    {
        self::isAuthorized('encaminharSemSubstituicao', $candidatoVaga, TRUE);
        
        try {
            TSqlSelect::customSelect('begin');
            
            $candidatoVaga->inserirHistorico(Status::Devolucao_Encaminhada, $parecer);
            
            $candidatoVaga->demissaosugestao = $demissaoSugestao;
            $candidatoVaga->salvar();
            
            TSqlSelect::customSelect('commit');
        }
        catch (Exception $e) {
            TSqlSelect::customSelect('rollback');
            throw new Exception($e->getMessage());
        }
    }
    
    /**
     * Encaminha a desvinculação com substituição de um terceirizado para a terceirizada
     * @param CandidatoVaga $candidatoVaga
     * @param $parecer
     * @param $demissaoSugestao
     */
    public static function encaminharComSubstituicao(CandidatoVaga $candidatoVaga, $parecer, $demissaoSugestao)
    {
        self::isAuthorized('encaminharComSubstituicao', $candidatoVaga, TRUE);
        
        try {
            TSqlSelect::customSelect('begin');
            
            $candidatoVaga->inserirHistorico(Status::Devolucao_Encaminhada_Substituicao, $parecer);
            
            $candidatoVaga->demissaosugestao = $demissaoSugestao;
            $candidatoVaga->salvar();
            
            TSqlSelect::customSelect('commit');
        }
        catch (Exception $e) {
            TSqlSelect::customSelect('rollback');
            throw new Exception($e->getMessage());
        }
    }
    
    /**
     * Confirma a desvinculação de um terceirizado
     * @param $candidatoVaga
     * @param $dataDesvinculacao
     */
    public static function confirmar(CandidatoVaga $candidatoVaga, $dataDesvinculacao)
    {
        self::isAuthorized('confirmar', $candidatoVaga, TRUE);
        
        try {
            pg_query(conexao::Conectar(), 'begin');
            
            $vaga = $candidatoVaga->getVaga();
            if ($candidatoVaga->getStatusAtual() == Status::Devolucao_Encaminhada_Substituicao OR 
                $candidatoVaga->getStatusAtual() == Status::Devolucao_SolicitadaNaoComparecimento OR 
                $candidatoVaga->getStatusAtual() == Status::Candidato_NaoCompareceu) {
                $vaga->statusid = Status::Vaga_AContratar;
                $vaga->ativa = FALSE;
                $vaga->salvar();
            }
            else {
                $vaga->resetarVaga(TRUE);
            }
            
            $candidatoVaga->inserirHistorico(Status::Devolucao_Confirmada);
            
            $candidatoVaga->ativo = FALSE;
     		$candidatoVaga->demissao = $dataDesvinculacao;
     		$candidatoVaga->salvar();
     		
     		pg_query(conexao::Conectar(), 'commit');
        }
        catch (exception $e) {
            pg_query(conexao::Conectar(), 'rollback');
            throw new Exception($e->getMessage());
        }
    }
    
    /**
     * Finaliza a desvinculação de um terceirizado
     * @param CandidatoVaga $candidatoVaga
     * @param $parecer
     */
    public static function finalizar(CandidatoVaga $candidatoVaga, $parecer)
    {
        self::isAuthorized('finalizar', $candidatoVaga, TRUE);
        
        try {
            pg_query(conexao::Conectar(), 'begin');
        
            $candidatoVaga->inserirHistorico(Status::Devolucao_Finalizada, $parecer);
            $candidatoVaga->inserirHistorico(Status::Candidato_ContratacaoFinalizada, NULL, 10);
            
            pg_query(conexao::Conectar(), 'commit');
        }
        catch (exception $e) {
            pg_query(conexao::Conectar(), 'rollback');
            throw new Exception($e->getMessage());
        }
    }
    
    /**
     * Verifica as condições de acesso do usuário à uma função
     * @param CandidatoVaga $operacao
     * @param $candidatoVaga
     * @param $throwExceptions
     */
    public static function isAuthorized($operacao, CandidatoVaga $candidatoVaga, $throwExceptions = FALSE)
    {
        $vaga     = $candidatoVaga->getVaga();
        $statusid = $candidatoVaga->getStatusAtual();
        $contrato = $vaga->getContrato();
        
        global $pfcid;
        
        if (!$contrato->podeMovimentarCandidatos()) {
            if ($throwExceptions) {
                throw new Exception('Não é possível realizar esta operação, pois o contrato não está confirmado.');
            }
            return FALSE;
        }
        
        if ($vaga->statusid != Status::Vaga_Ocupada) {
            if ($throwExceptions) {
                throw new Exception('Não é possível realizar esta operação, pois a vaga não está ocupada.');
            }
            return FALSE;
        }
        
        switch ($operacao) {
            case 'solicitar':
                switch ($pfcid) {
                    case PerfilComportamental::Orgao:
                        if ($statusid == Status::Candidato_ContratacaoFinalizada) {
                            return TRUE;
                        }
                        break;
                        
                    case PerfilComportamental::NucleoGestor:
                        if ($statusid == Status::Candidato_ContratacaoFinalizada) {
                            return TRUE;
                        }
                        break;
                }
                break;
                
            case 'aprovar':
            case 'reprovar':
                switch ($pfcid) {
                    case PerfilComportamental::Gabinete:
                        if ($statusid == Status::Devolucao_Solicitada_Orgao
                        OR $statusid == Status::Devolucao_Aprovada_Orgao) {
                            return TRUE;
                        }
                        break;
                        
                    case PerfilComportamental::Orgao:
                        if ($statusid == Status::Devolucao_Solicitada_NucleoGestor) {
                            return TRUE;
                        }
                        break;
                }
                break;
                
            case 'encaminharSemSubstituicao':
                if ($statusid == Status::Devolucao_Aprovada_NucleoCentral
                    AND $pfcid == PerfilComportamental::NucleoGestor 
                    AND !$vaga->hasSelecaoAtiva()) {
                    return TRUE;
                }
                break;
                
            case 'encaminharComSubstituicao':
                if ($statusid == Status::Devolucao_Aprovada_NucleoCentral
                    AND $pfcid == PerfilComportamental::NucleoGestor) {
                    return TRUE;
                }
                break;
                
            case 'confirmar':
                if ($pfcid == PerfilComportamental::Empresa 
                AND ($statusid == Status::Devolucao_Encaminhada_Substituicao 
                    OR $statusid == Status::Devolucao_Encaminhada 
                    OR $statusid == Status::Devolucao_SolicitadaNaoComparecimento)) {
                    return TRUE;
                }
                break;
                
            case 'finalizar':
                if ($pfcid == PerfilComportamental::NucleoGestor
                AND ($statusid == Status::Devolucao_Recusada_NucleoCentral
                    OR $statusid == Status::Devolucao_Recusada_Orgao)) {
                    return TRUE;
                }
                break;
        }
        if ($throwExceptions) {
            throw new Exception(self::ERRO_AUTORIZACAO);
        }
        return FALSE;
    }
}